/*
 * Copyright (c) 2011, Marc-Andre Ferland - madrang@gmail.com
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the The Warrent Team nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *     * This software is free for non-commercial use. You may not use this
 *       software, in whole or in part, in support of any commercial product
 *       without the express consent of the author.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE WARRENT TEAM BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
using System;
using System.Runtime.InteropServices;

using System.Collections;
using System.Collections.Generic;

using OsHelper.UsbNet;

namespace TestInfo
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Console.WriteLine ("Test-Info");
			Console.WriteLine ("");
			
			foreach (UsbDevice DeviceItem in UsbDevice.AllDevices)
			{
				try {
					Console.Write("Address: {0}.{1} ", DeviceItem.BusNumber, DeviceItem.DeviceAddress);
					
					DeviceItem.Open();
					
					Console.WriteLine("ID: {0:X4}:{1:X4}", DeviceItem.DeviceDescriptor.VendorID, DeviceItem.DeviceDescriptor.ProductID);
					Console.WriteLine("  Vendor: {0}", (OsHelper.UsbNet.Drivers.Id.VendorID)DeviceItem.DeviceDescriptor.VendorID);
					
					Console.WriteLine("  Usb {0}", DeviceItem.DeviceDescriptor.Specification);
					Console.WriteLine("  Version: {0}", DeviceItem.DeviceDescriptor.DeviceRelease);
					
					if(DeviceItem.SupportString) {
						Console.WriteLine("  CurrentLang: {0}", DeviceItem.Language);
						Console.WriteLine("  LangID");
						foreach (LanguageIdentifiers LangItem in DeviceItem.LanguageDescriptor.LanguageIdentifiers) {
							Console.WriteLine("    Lang: {0}", LangItem);
						}
					} else Console.WriteLine("  LangId and String Not Supported.");
					
					Console.WriteLine("  Manufacturer: {0}", DeviceItem.GetString(DeviceItem.DeviceDescriptor.ManufacturerStringIndex));
					Console.WriteLine("  Product: {0}", DeviceItem.GetString(DeviceItem.DeviceDescriptor.ProductStringIndex));
					Console.WriteLine("  Serial: {0}", DeviceItem.GetString(DeviceItem.DeviceDescriptor.SerialStringIndex));
					
					Console.WriteLine("  Active Configuration: {0}", DeviceItem.Configuration);
					
					foreach (OsHelper.UsbNet.Descriptors.ConfigurationDescriptor ConfigItem in DeviceItem.ConfigurationList())
					{
						Console.WriteLine("  Config: {0}", ConfigItem.ConfigurationValue);
						Console.WriteLine("    Info: {0}", DeviceItem.GetString(ConfigItem.StringIndex));
						Console.WriteLine("    MaxPower: {0:0.000}", ConfigItem.MaxPower);
						Console.WriteLine("    Self Powered: {0}", ConfigItem.SelfPowered);
						Console.WriteLine("    Remote Wakeup: {0}", ConfigItem.RemoteWakeup);
						Console.WriteLine("    Number Interfaces: {0}", ConfigItem.NumberInterfaces);
					
						foreach (OsHelper.UsbNet.Descriptors.InterfaceDescriptor InterfaceItem in ConfigItem.InterfaceList) {
							Console.WriteLine("    Interface: {0}", InterfaceItem.Number);
							Console.WriteLine("      Info: {0}", DeviceItem.GetString(InterfaceItem.StringIndex));
							Console.WriteLine("      Alternate Setting: {0}", InterfaceItem.AlternateSetting);
							Console.WriteLine("      Number Endpoints: {0}", InterfaceItem.NumberEndpoints);
							Console.WriteLine("      Class: {0}", InterfaceItem.Class);
							Console.WriteLine("      SubClass: {0}", InterfaceItem.SubClass);
							Console.WriteLine("      Protocol: {0}", InterfaceItem.Protocol);
							
							foreach (OsHelper.UsbNet.Descriptors.EndpointDescriptor EndpointItem in InterfaceItem.EndpointList) {
								Console.WriteLine("      Endpoint: {0}", EndpointItem.Number);
								Console.WriteLine("        Direction: {0}", EndpointItem.Direction);
								Console.WriteLine("        TransferType: {0}", EndpointItem.Attributes.Transfer);
								if(EndpointItem.Attributes.Transfer == OsHelper.UsbNet.Descriptors.TransferType.Isochronous) {
									Console.WriteLine("        Synchronisation: {0}", EndpointItem.Attributes.Synchronisation);
									Console.WriteLine("        Usage: {0}", EndpointItem.Attributes.Usage);
								}
							}
						}
					}
					
				} catch (Exception ex) {
					Console.WriteLine(ex);
				}
				
				DeviceItem.Dispose();
				
				Console.WriteLine ("");
			}
			
			Console.ReadLine();
		}
		
	}
}
